package com.spring.demo.webflux.demo.filter;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;

/**
 * 前面的演示都还是前处理，在后面的filter完成之后，控制流回到本filter。
 *
 * 可以在WebFilterChain的filter方法后面加入后处理逻辑，这个要熟悉spring reactor3的运算符/算子(operator),
 * 例如doFinally、then、thenEmpty、thenMany、map、flatMap等，后处理逻辑分布在这些运算符中，只要最终返回Mono<Void>即可。
 * @author wangzhilong
 * @date 2020/7/15
 */
@Component
@Order(10)
public class PostProcessingFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        //后处理，打印完成信号的值
        //建议尽量采用链式的fluent连贯写法
        return chain.filter(exchange).doFinally(s -> System.out.println("signal="+s.toString()));
    }
}
